解决 Timeshift 快照无法删除的问题:子卷“目录不为空”
这篇文章记录了我在使用 Timeshift + Btrfs 文件系统做系统备份时,遇到快照无法删除的问题,以及最终的解决方案。如果你也遇到类似情况,希望这篇文章对你有所帮助。
一、问题背景
在 Linux 下,我一直使用 Timeshift 进行系统快照备份,配合 Btrfs 文件系统,备份速度快,回滚也很方便。
某天我想删除一个旧快照,于是用了官方推荐的命令:
sudo timeshift --delete --snapshot 2025-05-22_22-00-51
结果却报错了:
E: ERROR: Could not destroy subvolume/snapshot: Directory not empty
E: Failed to delete snapshot subvolume: ...
尝试用底层命令 btrfs subvolume delete
删除,也一样提示“目录不为空”而失败。
二、问题原因分析
Btrfs 的快照,其实就是一个“只读子卷(subvolume)”。Btrfs 为了保护文件系统的完整性,不允许直接强删一个非空的子卷。也就是说:
- 即使你用了
rm -rf
把子卷里能看到的文件都删了; - 只要子卷里面还有隐藏文件、挂载点,或者有子卷嵌套;
- 系统就会认为这个目录**“还没清空”**,于是拒绝删除。
所以,我们需要按 Btrfs 的方式一步步清理干净,然后再手动删除子卷。
三、解决方案(实测有效)
步骤 1:挂载 Btrfs 根分区
首先找到你的根分区设备名(我的是 /dev/nvme0n1p2
),然后挂载:
sudo mkdir -p /mnt/btrfs-root
sudo mount /dev/nvme0n1p2 /mnt/btrfs-root
步骤 2:清空快照目录下的内容
sudo rm -rf /mnt/btrfs-root/timeshift-btrfs/snapshots/2025-05-22_22-00-51/@/*
sudo rm -rf /mnt/btrfs-root/timeshift-btrfs/snapshots/2025-05-22_22-00-51/@/.* 2>/dev/null
上面的
.*
是为了删除隐藏文件(比如.bashrc
、.config
等)
步骤 3:删除子卷本体
sudo btrfs subvolume delete /mnt/btrfs-root/timeshift-btrfs/snapshots/2025-05-22_22-00-51/@
如果顺利,会提示类似:
Delete subvolume 256 (no-commit): ...
步骤 4:删除整个快照目录
sudo rm -rf /mnt/btrfs-root/timeshift-btrfs/snapshots/2025-05-22_22-00-51
步骤 5:卸载挂载点(可选)
sudo umount /mnt/btrfs-root
sudo rmdir /mnt/btrfs-root
四、常见问题提示
- 如果删除失败,先确认该快照子卷里有没有嵌套的子卷(用
btrfs subvolume list
查看); - 如果提示“没有这个目录”,可能是挂载路径错了,检查
mount
命令的设备是否匹配; - 如果你不确定自己的根分区是哪一个,可以用
lsblk
或df -h
查查看。
五、总结
这个问题其实不是 Timeshift 的 Bug,而是 Btrfs 的“安全机制”:子卷删除前必须彻底清空。
只要掌握了 Btrfs 子卷的处理方式,手动清理也不算太难。对于经常折腾系统的朋友来说,了解这些底层机制反而是一次不错的学习机会。
参考命令速查:
# 查看子卷列表
sudo btrfs subvolume list /mnt/btrfs-root
# 删除子卷
sudo btrfs subvolume delete /mnt/路径/子卷名
# 检查当前挂载
mount | grep timeshift
如果你也曾被这个问题困扰,欢迎留言交流 😄